{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import torch\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline  \n",
    "from matplotlib.font_manager import FontProperties"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Usage\n",
    "\n",
    "This notebook is to visualize the output of `all_in_one_cifar10.py` and `all_in_one_imagenet.py` simply change the `df = pd.read_csv('ifgsm_imagenet_0.03_new.csv')` definition below to read_csv from your specific output file."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num batches: 1599\n"
     ]
    }
   ],
   "source": [
    "df = pd.read_csv('Incv3-bimLAA_test_copy.csv')\n",
    "print(\"num batches: \" + str(df[df.with_ILA == True]['batch_index'].max()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def visualize_result(df):\n",
    "    source_models = df.source_model.unique()\n",
    "    target_models =  df.target_model.unique()\n",
    "#     attacks = df.fool_method.unique()\n",
    "    metrics = ['acc_after_attack']\n",
    "    for metric in metrics:\n",
    "\n",
    "        for source_model in source_models:\n",
    "            fig = plt.figure(figsize = [6*1, 4])\n",
    "            shared_ax = None\n",
    "#             for i, attack in enumerate(attacks):\n",
    "\n",
    "            if shared_ax == None:\n",
    "                shared_ax = plt.subplot(1,1,1)\n",
    "            else:\n",
    "                plt.subplot(1,1,1, sharey=shared_ax)\n",
    "\n",
    "            layer_indexs = df[df.source_model == source_model]['layer_index'].unique()[1:]\n",
    "            layer_names = df[df.source_model == source_model]['layer_name'].unique()[1:]\n",
    "            print(layer_names)\n",
    "            for target_model in target_models:           \n",
    "                r = df[(df.source_model == source_model) & (df.target_model == target_model)]\n",
    "\n",
    "                fla = r[r.with_ILA].groupby('layer_index')\n",
    "                other = r[r.with_ILA == False]\n",
    "                xs = fla.layer_index.unique()\n",
    "                baseline = other[metric].mean()\n",
    "                fla_r = fla[metric].mean()\n",
    "                names = fla.layer_name.unique()\n",
    "                p = plt.plot(layer_indexs,  [baseline for i in xs], linestyle = '--', label = target_model)\n",
    "                plt.plot(fla_r, label =  target_model + \" IAA\", color = p[0]._color)\n",
    "                if source_model != target_model and ((metric == 'fool_rate' and not(fla_r > baseline).any())or (metric == 'acc_after_attack' and not(fla_r < baseline).any())):\n",
    "                    print(\"never perform absolutely better: \" + source_model + \" \" + target_model)\n",
    "\n",
    "            plt.ylim([0,75])\n",
    "            plt.ylabel('Accuracy after Attack')\n",
    "            plt.xlabel('Layer Index')\n",
    "            fontP = FontProperties()\n",
    "            fontP.set_size('small')\n",
    "                \n",
    "            plt.legend(ncol = 3, loc=2, prop=fontP)\n",
    "        plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>source_model</th>\n",
       "      <th>target_model</th>\n",
       "      <th>original_acc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>76.8750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>Inc-v4</td>\n",
       "      <td>79.6250</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>IncRes-v2</td>\n",
       "      <td>80.3750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>ResNet50</td>\n",
       "      <td>18.5625</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>VGG16</td>\n",
       "      <td>16.0625</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>VGG19</td>\n",
       "      <td>16.0000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  source_model target_model  original_acc\n",
       "0       Inc-v3       Inc-v3       76.8750\n",
       "1       Inc-v3       Inc-v4       79.6250\n",
       "2       Inc-v3    IncRes-v2       80.3750\n",
       "3       Inc-v3     ResNet50       18.5625\n",
       "4       Inc-v3        VGG16       16.0625\n",
       "5       Inc-v3        VGG19       16.0000"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Original model accuracies\n",
    "# df.groupby(['source_model', 'target_model','fool_method'])['original_acc'].mean().reset_index()\n",
    "df.groupby(['source_model', 'target_model'])['original_acc'].mean().reset_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Conv2d_1a_3x3' 'Conv2d_2a_3x3' 'Conv2d_2b_3x3' 'maxpool1'\n",
      " 'Conv2d_3b_1x1' 'Conv2d_4a_3x3' 'maxpool2' 'Mixed_5b' 'Mixed_5c'\n",
      " 'Mixed_5d' 'Mixed_6a' 'Mixed_6b' 'Mixed_6c' 'Mixed_6d' 'Mixed_6e'\n",
      " 'AugLogits']\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "visualize_result(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>source_model</th>\n",
       "      <th>target_model</th>\n",
       "      <th>acc_after_attack</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>0.0625</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>Inc-v4</td>\n",
       "      <td>45.5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>IncRes-v2</td>\n",
       "      <td>45.5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>ResNet50</td>\n",
       "      <td>27.5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>VGG16</td>\n",
       "      <td>20.6250</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>VGG19</td>\n",
       "      <td>19.4375</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  source_model target_model  acc_after_attack\n",
       "0       Inc-v3       Inc-v3            0.0625\n",
       "1       Inc-v3       Inc-v4           45.5000\n",
       "2       Inc-v3    IncRes-v2           45.5000\n",
       "3       Inc-v3     ResNet50           27.5000\n",
       "4       Inc-v3        VGG16           20.6250\n",
       "5       Inc-v3        VGG19           19.4375"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "baseline = df[df.with_ILA == False].groupby(['source_model', 'target_model'])['acc_after_attack'].mean().reset_index()\n",
    "baseline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>source_model</th>\n",
       "      <th>target_model</th>\n",
       "      <th>layer_index</th>\n",
       "      <th>acc_after_attack</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.4375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4.5625</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1.8750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.1250</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>91</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>VGG19</td>\n",
       "      <td>11.0</td>\n",
       "      <td>15.5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>92</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>VGG19</td>\n",
       "      <td>12.0</td>\n",
       "      <td>16.6250</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>VGG19</td>\n",
       "      <td>13.0</td>\n",
       "      <td>18.4375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>VGG19</td>\n",
       "      <td>14.0</td>\n",
       "      <td>20.8125</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>Inc-v3</td>\n",
       "      <td>VGG19</td>\n",
       "      <td>15.0</td>\n",
       "      <td>13.5625</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>96 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   source_model target_model  layer_index  acc_after_attack\n",
       "0        Inc-v3       Inc-v3          0.0            4.4375\n",
       "1        Inc-v3       Inc-v3          1.0            4.5625\n",
       "2        Inc-v3       Inc-v3          2.0            1.8750\n",
       "3        Inc-v3       Inc-v3          3.0            0.1250\n",
       "4        Inc-v3       Inc-v3          4.0            1.5000\n",
       "..          ...          ...          ...               ...\n",
       "91       Inc-v3        VGG19         11.0           15.5000\n",
       "92       Inc-v3        VGG19         12.0           16.6250\n",
       "93       Inc-v3        VGG19         13.0           18.4375\n",
       "94       Inc-v3        VGG19         14.0           20.8125\n",
       "95       Inc-v3        VGG19         15.0           13.5625\n",
       "\n",
       "[96 rows x 4 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# ILA\n",
    "q = df[(df.with_ILA == True)].groupby(['source_model', 'target_model','layer_index'])['acc_after_attack'].mean().reset_index()\n",
    "baseline.head()\n",
    "q\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
